package com.atguigu.crowd.mvc.handler;

import com.atguigu.crowd.constant.CrowdConstant;
import com.atguigu.crowd.entity.Admin;
import com.atguigu.crowd.service.api.AdminService;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@Controller
public class AdminHandler {


    @Autowired
    private AdminService adminService;

    /**
     * 用户维护页  更新操作
     * @param admin
     * @param pageNum
     * @param keyword
     * @return
     */
    @RequestMapping("/admin/update.html")
    public  String update(
            Admin admin,
            @RequestParam("pageNum") Integer pageNum,
            @RequestParam("keyword") String keyword
                          ){
        adminService.update(admin);

        //使用接收到的参数到指定页面
        return "redirect:/admin/get/page.html?pageNum="+pageNum+"&keyword="+keyword;
    }
    /**
     * 用户维护页  编辑/更新信息 去到对应编辑页面
     * @param adminId
     * @param modelMap
     * @return
     */
    @RequestMapping("/admin/to/edit/page.html")
    public String toEditPage(
            //接收参数
            @RequestParam("adminId") Integer adminId,
           ModelMap modelMap
    ){
        //1.根据adminId查询Admin对象
        Admin admin=adminService.getAdminById(adminId);

        //2.
        modelMap.addAttribute("admin",admin);

        return "admin-edit";
    }

    /**
     * 用户维护页  新增
     * @param admin
     * @return
     */
   // @PreAuthorize("hasAuthority('user:save')")
    @RequestMapping("/admin/save.html")
    public String save(Admin admin){
        adminService.saveAdmin(admin);

        //怼到最后一页
        return  "redirect:/admin/get/page.html?pageNum="+Integer.MAX_VALUE;

     }


     /**
     * 用户维护页面  单条删除
     * @param adminId
     * @param pageNum
     * @param keyword
     * @return
     */
    @RequestMapping("/admin/remove/{adminId}/{pageNum}/{keyword}.html")
    public String remove(
            @PathVariable("adminId") Integer adminId,
            @PathVariable("pageNum") Integer pageNum,
            @PathVariable("keyword") String keyword){
        //执行删除
        adminService.remove(adminId);

        //页面跳转 回到分页页码 不能直接去admin-page.jsp

        //转发到/admin/get/page.html 一旦刷新页面会被执行重复删除操作 浪费性能

        //重定向到/admin/get/page.html
        // 同时为了保持原本所在的页面和查询的关键词 附加PageNum和keyword两个请求参数
        return "redirect:/admin/get/page.html?pageNum="+pageNum+"&keyword="+keyword;

    }


    /**
     * 用户维护页面---页面数据  分页 关键词查询
     * @param keyword
     * @param pageNum
     * @param pageSize
     * @param modelMap
     * @return
     */
    @RequestMapping("/admin/get/page.html")
    public String getPageInfo(
            //keyword有时有 有时无 设置默认为空字符串
            @RequestParam(value = "keyword",defaultValue = "") String keyword,
            //pageNum 默认值设为1
            @RequestParam(value = "pageNum",defaultValue = "1") Integer pageNum,
            //pageSize 默认值设为5
            @RequestParam(value = "pageSize",defaultValue = "5") Integer pageSize,
            ModelMap modelMap
                               ){
        //调用Service方法获取PageInfo对象
        PageInfo<Admin> pageInfo = adminService.getPageInfo(keyword, pageNum, pageSize);
        //将PageInfo对象存入模型
        modelMap.addAttribute(CrowdConstant.ATTR_NAME_PAGE_INFO,pageInfo);

        //去admin-page 在页面显示数据
        return  "admin-page";

    }

    //    使用spring security关联退出登录处理
    @Deprecated
    @RequestMapping("/admin/do/logout.html")
    public String doLogout(HttpSession session){
        //强转session失效
        session.invalidate();

        //回到登录页面
        return "redirect:/admin/to/login/page.html";
    }

//    使用spring security关联登录处理
    @Deprecated
    @RequestMapping("/admin/do/login.html")
    public String doLogin(
            @RequestParam("loginAcct") String loginAcct,
            @RequestParam("userPswd") String userPswd,
            HttpSession session  //登录成功需要把管理员对象传入session
                          ){
        //调用Service方法进行登录检查
        //这个方法能够返回admin对象 说明登录成功 如果账户密码不正确 则抛出异常
       Admin admin= adminService.getAdminByLoginAcct(loginAcct,userPswd);

       //将登录成功返回的admin对象存入Session域
        session.setAttribute(CrowdConstant.ATTR_NAME_LOGIN_ADMIN,admin);

        //成功去后台主页面
        //重定向过去 但需要springMVC转发下 使用view-controller
        return "redirect:/admin/to/main/page.html";
    }
}
